// Package main
// Created by GoLand
// @User: lenora
// @Date: 2023/11/23
// @Time: 17:53

package generics

type List interface {
	Add(index int, val any)
	Append(val any) error
	Delete(index int) error
}

type LinkList struct {
}

func (l *LinkList) Add(index int, val any) {
	panic("implement me")
}

func (l *LinkList) Append(val any) error {
	panic("implement me")
}

func (l *LinkList) Delete(index int) error {
	panic("implement me")
}

// ListV1
// 接口/结构体名称[类型参数 约束(类型参数需要满足的约束)]
// 泛型
type ListV1[T any] interface {
	Add(index int, val []T)
	Append(val T) error
	Delete(index int) error
}

type LinkListV1[T any] struct {
}

func NewLinkListV1[T any]() ListV1[T] {
	return &LinkListV1[T]{}
}

func (l *LinkListV1[T]) Add(index int, val []T) {
	//panic("implement me")
	println("yes  ok\n")
}

func (l LinkListV1[T]) Append(val T) error {
	panic("implement me")
}

func (l LinkListV1[T]) Delete(index int) error {
	panic("implement me")
}

func LinkListFunc() {
	//lk := new(LinkList)
	//参数类型是any而未使用泛型的情况下,参数类型得不到约束,那么方法是不安全的
	//lk.Add(2, []string{"123", "456"})

	//而泛型的存在保证了对类型限制的可控
	lkV1 := &LinkListV1[int]{}
	lkV1.Add(2, []int{123})
}
